Android – ListView动态按钮,用于调用动态侦听器的每一行

我是android的新手,我花了最近2天尝试前面的例子和在线解决方案,但我似乎无法理解它:(

我能够显示列表视图,从在线解析一些json并存储书名,书籍描述和书籍ID,并在列表视图中显示这些数据.我希望能够在ListView的每一行中放置一个“下载”按钮,每个按钮将对应于Click()上的书籍ID,动作监听器将通过将该ID附加到URL来下载该书.
例如www.books.com/download_book1或/ download_book2 ….

这是我的代码. Catalogue.java

public class Catalogue extends ListActivity {

private JSONObject json;
private ListView lv;

private ArrayList<Integer> alKey = new ArrayList<Integer>();

@Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState); //icicle
            setContentView(R.layout.shelflist);
            ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();


....
try{

                JSONArray entries = json.getJSONArray("entries");

                for(int i=0;i<entries.length();i++){                        
                    HashMap<String, String> map = new HashMap<String, String>();    
                    JSONObject e = entries.getJSONObject(i);

                    alKey.add(e.getInt("key")); 
                    map.put("id",  String.valueOf(i));
                    map.put("title", "Title:" + e.getString("title"));
                    map.put("description", "Description: " +  e.getString("description"));
                    mylist.add(map);


                }       
            }catch(JSONException e)        {
                 Log.e("log_tag", "Error parsing data "+e.toString());
            }

            listadapter adapter = new SimpleAdapter(this, mylist , R.layout.shelfrow, 
                            new String[] { "title", "description" }, 
                            new int[] { R.id.item_title, R.id.item_subtitle });

            setlistadapter(adapter);

                    lv = getListView();
                    lv.setTextFilterEnabled(true);  

…..

这是我得到的.我不知道如何在List中每行添加1个按钮,并为每个按钮分配一个动作监听器.
我还有一个shelfrow.xml文件(textView,textView for item_title和item_subtitle)和一个shelflist.xml文件(ListView).
我有一个shelf.xml文件

解决方法:

基本上你需要学习ListAdapter的概念.

这是一个短篇小说:图片中包含要在列表中显示的数据的对象,以及单独显示每一行的方式.这是你的listadapter.现在拿出每一行:它是一本带有标题和OnClickListener的书.它在带有TextView(用于标题)和Button(用于OnClickListener)的View中呈现.您需要做的就是将一个View提供给将用于每一行的适配器,以及一个要列在列表中的书籍列表.

这是一些示例代码.我希望它可以解决一些问题

private class MyItemmodel{ //that's our book
    String title; // the book's title
            String description;
            long id;
    OnClickListener listener = new OnClickListener(){ // the book's action
        @Override
        public void onClick(View v) {
                            // the default action for all lines
            doSomethingWithTheBookTitleOrUniqueId(this);
        }
    };
}

private class Mylistadapter extends BaseAdapter{
    View renderer;
    List<MyItemmodel> items;

            // call this one and pass it layoutInflater.inflate(R.layout.my_list_item)
    public Mylistadapter(View renderer) {
        this.renderer = renderer;
    }

            // whenever you need to set the list of items just use this method.
            // call it when you have the data ready and want to display it
    public void setModel(List<MyItemmodel> items){
        this.items = items;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return items!=null?items.size():0;
    }
    @Override
    public Object getItem(int position) {
        return items!=null?items.get(position):null;
    }
    @Override
    public long getItemId(int position) {
        return items!=null?items.get(position).id:-1;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView==null){
            convertView = renderer;
        }
        MyItemmodel item = items.get(position);
             // replace those R.ids by the ones inside your custom list_item layout.
        TextView label = (TextView)convertView.findViewById(R.id.item_title);
        label.setText(item.label);
        Button button = (Button)convertView.findViewById(R.id.item_button);
        button.setonClickListener(item.listener);
        return convertView;
    }
}

为了传递List,而不是将数据放在你的hashmaps列表中,你可以这样做(小心,我也根据你的需要更新了MyItemmodel和Mylistadapter,添加了id和description属性):

List<MyItemmodel> myListModel = new ArrayList<MyItemmodel>();
try{
    JSONArray entries = json.getJSONArray("entries");
    for(int i=0;i<entries.length();i++){                        
        MyItemmodel item = new MyItemmodel();    
        JSONObject e = entries.getJSONObject(i);
        alKey.add(e.getInt("key")); 
        item.id = i;
        item.title = e.getString("title");
        item.description = e.getString("description");
        // you can change the button action at this point: 
        // item.onClickListener = new OnClickListener(){...};
        myListModel.add(item);
    }

}catch(JSONException e)        {
    Log.e("log_tag", "Error parsing data "+e.toString());
}
listadapter adapter = new Mylistadapter(getLayoutInflater().inflate(R.layout.shelfrow, this));
adapter.setModel(myListModel);
setlistadapter(adapter);
lv = getListView();
lv.setTextFilterEnabled(true); 

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...