персонализированный адаптер не работает в моем приложении для Android

#android #listview

#Android #listview

Вопрос:

Я пытаюсь использовать адаптер в своем приложении для Android для добавления изображений в мои элементы в моем ListView :

это мой адаптер :

 public class ItemAdapter extends ArrayAdapter<String> {

    private final Context context;
    private final String[] Names;
    private final int rowResourceId;

    public ItemAdapter(Context context, int textViewResourceId, String[] objects) {

        super(context, textViewResourceId, objects);

        this.context = context;
        this.Names = objects;
        this.rowResourceId = textViewResourceId;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rowView = inflater.inflate(rowResourceId, parent, false);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.imageFileView);
        TextView textView = (TextView) rowView.findViewById(R.id.fileName);

        String name = Names[position];
        String extFile = Names[position].substring(Names[position].lastIndexOf("."));

        textView.setText(name);

        String uri = "drawable/" extFile;

        // int imageResource = R.drawable.icon;
        //int imageResource = getResources().getIdentifier(uri, null, getPackageName());

        // set image to ImageView
        Uri imgUri=Uri.parse(uri);
        imageView.setImageURI(imgUri);
        return rowView;  
    }
}
  

Я также использую другой адаптер в своем приложении, чтобы добавить запрос на обновление в мой ListView, но этот работает отлично.

я думаю, что он не вызывает мой «ItemAdapter», потому что system.out.print ничего не показывает

Я называю свой адаптер следующим образом :

 public void getList(){
    client.get(server "get/files/1" folderPath, new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(JSONArray files) {
            String[] listeNames=new String[files.length()];

            for (int i = 0; i < files.length(); i  ) {
                try {
                    listeNames[i]=files.getString(i);
                } catch (JSONException e) {
                    System.err.println("error :" e.getMessage());
                }
            }
            list_files.setAdapter(new ItemAdapter(mainActivity,android.R.layout.simple_list_item_1,listeNames));
            list_files.setAdapter(new ArrayAdapter<String>(mainActivity,android.R.layout.simple_list_item_1,listeNames));
             ((PullToRefreshListView) list_files).onRefreshComplete();               
        }
    });
}
  

Ответ №1:

У A ListView может быть только один Adapter . Проблема в том, что вы делаете это:

 list_files.setAdapter(new ItemAdapter(mainActivity,android.R.layout.simple_list_item_1,listeNames));
list_files.setAdapter(new ArrayAdapter<String>(mainActivity,android.R.layout.simple_list_item_1,listeNames));
  

Таким образом, второй Adapter переопределяет первый. Именно по этой причине он работает отлично и ItemAdapter никогда не вызывается.

Вы должны попытаться собрать эти два Adapter s в один.

Комментарии:

1. да, я тоже думал об этом, но как я могу это сделать, потому что ArrayAdapter не является персонализированным адаптером

2. @yassine__ Ваш пользовательский адаптер расширяет ArrayAdapter, что означает, что он наследует все качества ArrayAdapter. Так что я не понимаю вашей точки зрения

3. An ArrayAdapter — это просто объект, используемый для заполнения ListView . Поэтому создайте свой собственный Adapter , расширив ArrayAdapter класс (как вы сделали для ItemAdapter ) и поместите всю логику в этот пользовательский класс.

4. ах, хорошо, я новичок в Android, поэтому я этого не знал

5. Да, есть много вещей, которые нужно знать об Android;) Вы можете принять этот ответ, если он был полезен для вас, чтобы другие, столкнувшиеся с такой же проблемой, легко нашли способ ее решения.