0

我正在尝试创建一个包含文件名的列表视图。我想为每个列表项设置一个附加信息,如文件 ID,所以当我单击文件名时,我必须从中获取文件 ID。请帮我这样做。

我的示例代码: ListView listview = (ListView) findViewById(R.id.listview); ArrayAdapter fileListAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, ['one','two','three']); listview.setAdapter(fileListAdapter);

4

1 回答 1

0

这里涉及很多事情,所以我为您提供了一个如何实现这一目标的示例(您可以复制粘贴和测试):

    public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // First we simulate a pool of file names and IDs
        String[] fileNames = {"fileName1", "fileName2", "fileName3"};
        List<Integer> fileNameIds = new ArrayList<Integer>();        
        fileNameIds.add(1200);
        fileNameIds.add(356);
        fileNameIds.add(28);

        // We call our custom Adapter
        ArrayAdapter<String> adapter = new CustomAdapter(this, fileNames, fileNameIds);

        // Finally we set the adapter to our list
        setListAdapter(adapter);
    }

    // This is a custom adapter that uses ArrayAdapter for our purpose 
    // (as this is just an example you should consider using Base Adapter if you don't want
    // to have a pool of filenames and a separate pool of ids)
    class CustomAdapter extends ArrayAdapter<String>{

        private final LayoutInflater INFLATER;
        private final String[] FILE_NAMES;
        private final List<Integer> FILE_NAME_IDS;

        public CustomAdapter(Context context, String[] fileNames, List<Integer> fileNameIds) {
            super(context, R.layout.custom_row, fileNames);
            this.INFLATER = LayoutInflater.from(context);
            this.FILE_NAMES = fileNames;
            this.FILE_NAME_IDS = fileNameIds;
        }

        // HERE is where you can assign effectively an ID to your rows
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            // this is an object that takes advantage of the holder pattern
            // it retains the state of our rows in the list
            FileNameHolder holder; 

            if(convertView == null){
                convertView = INFLATER.inflate(R.layout.custom_row, null); // inflate your custom row

                // now you need to assign specific identifier to the list row that the holder will retain
                // for you, so you can always get this id by calling getTag from the View object on your
                // item click listeners
                holder = new FileNameHolder();
                holder.fileName = (TextView) convertView; //since i only have a texView in layout i don't need to call findByView
                convertView.setTag(holder); // relate the view to a custom FileNameHolder object that retains file name and its ID

            } else{
                holder = (FileNameHolder) convertView.getTag();
            }

            holder.fileName.setText(FILE_NAMES[position]); // PROVIDE the list with file name description
            holder.idFileName = FILE_NAME_IDS.get(position); // ASSIGN file name ID

            return convertView;
        }

    }

    // This is an example of catching a row clicked and get the custom ID that you assigned, 
    // from here you can use that ID as you need
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {

        // Here as you can see we obtain the object associated with the row that was clicked
        FileNameHolder holder = (FileNameHolder) v.getTag();

        // Here i provide a way you can test that you're always getting the correct file name and Id 
        Toast.makeText(this, 
                "File Name = " + holder.fileName.getText() + 
                ", File ID = " + holder.idFileName, 
                Toast.LENGTH_SHORT).show();
    }


    // This is a class that takes advantage of the Holder Pattern and we use it to 
    // achieve what you need (remember this is just an example you should consider 
    // changing class and member access modifiers as you need)
    class FileNameHolder{
        Integer idFileName;
        TextView fileName;

        FileNameHolder() {
        }
    }

}

custom_row.xml只是一个 TextView(我从 simple_list_item_1 布局中获取):

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:paddingStart="?android:attr/expandableListPreferredItemPaddingLeft"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:gravity="center_vertical"
/>

希望它是有用的......问候!

于 2013-03-29T22:51:13.093 回答