android自定义simplecursoradapter选择/突出显示一行

时间:2013-09-07 09:50:25

标签: android row highlighting simplecursoradapter

我有一个ListActivity,然后管理一个simplecursoradapter来显示文本和图像以及每月每天的分隔符。此分隔符和送入适配器的信息是使用viewbinder完成的。由于我需要这个应用程序在API 8中工作,我发现的一些答案似乎不适用于该API版本。

到目前为止,我已经尝试使用OnItemClickListener来获取所选的行,然后我已经存储了该行的位置并将其与getView方法一起使用以尝试设置背景资源但是它看起来改变的只是颜色分隔符,而不仅仅是当前选定的行,但也包括其他行。

OnItemClickListener已被更改几次,因此当前代码是我的最后一次尝试失败:

datalist.setOnItemClickListener(new  OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                mC.moveToPosition(arg2); // The Cursor 
                rowchecked = arg2; // Global variable to store the position
                arg1.setBackgroundResource(android.R.color.holo_red_dark); // this is a recent attempt but I knew it would not work 

            Toast.makeText(getApplicationContext(), "Row "+Integer.toString(arg2) + " Clicked", Toast.LENGTH_LONG).show();

            }});

数据列表分配如下:

 ListView datalist = getListView();
 datalist.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);

getView如下:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.viewdata, mC, fields, viewfields)
        {
            @Override
            public View getView(int position,View convertView, ViewGroup parent) {

                final View row = super.getView(position, convertView, parent);
                if (position == rowchecked) {
                    Toast.makeText(getApplicationContext(), "Detected row selected , row is :"+Integer.toString(rowchecked), Toast.LENGTH_LONG).show();
                 //row.setBackgroundResource(Color.BLUE);
                    row.setBackgroundColor(Color.BLUE);
                mC.moveToPosition(position);
                row.setSelected(true);
        }

                return row;
            }
        };

如果需要viewbinder代码,那么我会在请求时发布 - 那里有很多,所以我不知道发布这一切的所有内容。

***编辑****

真的很难让这个帖子的OnitemLongClick部分工作OnitemClick似乎使用/调用simplecursoradapter的getView方法,但是OnItemLongClick Listener没有。

阅读其他帖子,包括这个帖子 - &gt; how to implement a long click listener on a listview

我已经尝试了针对代码中listview对象的setonlongclick(true),我尝试将其分配给XML布局中的listview,另外我已经使用AdapterView.OnItemLongClick Listener创建了OnItemLongLick Listener。

1 个答案:

答案 0 :(得分:0)

到目前为止,我已经使用onItemLongClickListener来使用适配器中的notifydatasetchange来调用getView。我的问题是,当选择行时,它总是突出显示列表中的第一行。

现在使用setviewbinder和setviewvalue方法对此进行排序..这里是代码:

// is the current cursor position the same that has been Long Clicked             
if (cursor.getPosition()==longrowclick1) {  

    // sets up parent view of object  
     myviewp = (View) view.getParent();  
     // checks if parent view is valid (there are a lot here)  
    if (((View)view.getParent()).getId()==R.id.Table1  || ((View)view.getParent()).getId()==R.id.tableRow1 || ((View)view.getParent()).getId()==R.id.tableRow2  || ((View)view.getParent()).getId()==R.id.tableRow3  || ((View)view.getParent()).getId()==R.id.Table2 || ((View)view.getParent()).getId()==R.id.Table3 ) {  

        // If the parent views are valid set the background to dark slate blue  
        myviewp.setBackgroundResource(R.drawable.darkslateblue);  
        // if one of the child views are not the date separator then ..  
        if (view.getId()!=R.id.seper) {  
            // ... set them to the dark slate blue ...  
            view.setBackgroundResource(R.drawable.darkslateblue);  
        } else { // else if the child object is the date separator ..  
            // .. keep it as dark gray  
            view.setBackgroundColor(Color.DKGRAY);  
        }  



    }  




} else {// if the cursor position does not match the Long Click Position then ..  
    // .. get the parent of the current child object ...  
     myviewp = (View) view.getParent();  
     // .. set the background of the parent to black ..  
    myviewp.setBackgroundColor(Color.BLACK);  
    // .. check to make sure that the child object is not the date separator ...  
    if (view.getId()!=R.id.seper) {  
        // .. and then set the child object background to black ..   
        view.setBackgroundColor(Color.BLACK);   
     } else { // .. else if it the child object is the date separator then ..  
         // .. set it to the dark gray background .   
         view.setBackgroundColor(Color.DKGRAY);  
     }  


}