Как установить значок (изображение) для каждой строки в списке. Доступ к элементам просмотра списка через некоторую папку в SD-карте

Я новичок в Android-разработке. У меня есть несколько pdf-файлов на SD-карте, и я успешно отобразил их в listView, и я могу открыть их из самого списка.

Теперь мне нужно установить значок (любое изображение) для каждого элемента списка (pdf).

Пожалуйста помоги.

вот код:

CustomListVIewAdapter.java

public class CustomListViewAdapter extends ArrayAdapter<RowItem> {

Context context;

public CustomListViewAdapter(Context context, int resourceId,
                             List<RowItem> items) {
    super(context, resourceId, items);
    this.context = context;
}

/*private view holder class*/
private class ViewHolder {
    ImageView imageView;
    TextView txtTitle;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    RowItem rowItem = getItem(position);

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.custom_list, null);
        holder = new ViewHolder();
        holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
        holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();

    holder.txtTitle.setText(rowItem.getTitle());
    holder.imageView.setImageResource(rowItem.getImageId());

    return convertView;
}
}

Main.java

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_download_reports, container, false);

    ListView listView;
    List<RowItem> rowItems;
    final ArrayList<String> FilesInFolder = AccessFiles(Environment.getExternalStorageDirectory()
            + "/SOMEFOLDER");

    rowItems = new ArrayList<RowItem>();
    for (int i = 0; i < FilesInFolder.size(); i++) {
        RowItem item = new RowItem(images[i], FilesInFolder.get(i));
        rowItems.add(item);
    }

    listView = (ListView) rootView.findViewById(R.id.list_of_files);

    CustomListViewAdapter adapter = new CustomListViewAdapter(getActivity(), R.layout.custom_list, rowItems);
    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            String fileName = FilesInFolder.get(position);
            open_File(fileName);
        }
    });
    return rootView;
}

//Access folder from the path that is passed and get it in listview
public ArrayList<String> AccessFiles(String DirectoryPath) {
    ArrayList<String> Reports = new ArrayList<String>();
    File file = new File(DirectoryPath);

    file.mkdirs();
    File[] files = file.listFiles();
    if (files.length == 0)
        return null;
    else {
        for (int i = 0; i < files.length; i++)
            Reports.add(files[i].getName());
    }
    return Reports;
}

//Open file method to open file on listitem click 
public void open_File(String filename) {
    File filee = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/SOMEFOLDER", filename);

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.fromFile(filee), "application/pdf");
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    Intent intent1 = Intent.createChooser(intent, "Open With");
    try {
        startActivity(intent1);
    } catch (ActivityNotFoundException e) {
        // Instruct the user to install a PDF reader here, or something
    }
}
}

RowItem.java

public class RowItem {
    private int imageId;
    private String title;

    public RowItem(int imageId, String title) {
        this.imageId = imageId;
        this.title = title;
    }
    public int getImageId() {
        return imageId;
    }
    public void setImageId(int imageId) {
        this.imageId = imageId;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    @Override
    public String toString() {
        return title;
    }
}

Ошибка

Журнал

D/AndroidRuntime﹕ Shutting down VM
05-28 14:10:51.810    7888-7888/myprojectname
E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: myprojectname, PID: 7888
java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
        at projectname/main.onCreateView(main.java:47)
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:953)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:456)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5257)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

person Rohit Kumar Verma    schedule 28.05.2015    source источник


Ответы (2)


Вы не добавили метод getcount(). Добавьте код ниже. Также инициализируйте элементы.

public int getCount() {
        return items.size();
}
person Chandra Sharma    schedule 28.05.2015
comment
Это не помогает. Ошибка: не удается разрешить размер метода () - person Rohit Kumar Verma; 29.05.2015
comment
список, который вы передаете адаптеру, возвращает этот размер или длину. - person Chandra Sharma; 29.05.2015

Наконец, я сделал это.

Мне не нужно было использовать CustomVIewAdapter. Просто ArrayAdpter делает свою работу.

Адаптер ArrayAdapter = новый ArrayAdapter (getActivity(), R.layout.custom_list, R.id.title, FilesInFolder); // FilesInFolder — это путь, по которому мои файлы хранятся на SD-карте

person Rohit Kumar Verma    schedule 29.05.2015