Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 完全无响应的Android自定义适配器_Java_Android_Android Arrayadapter_Onclicklistener - Fatal编程技术网

Java 完全无响应的Android自定义适配器

Java 完全无响应的Android自定义适配器,java,android,android-arrayadapter,onclicklistener,Java,Android,Android Arrayadapter,Onclicklistener,似乎无法确定适配器的问题。我试图在checkedTextView下方放置一个进度条,以尽量减少元素数量和相对布局的麻烦(将加载条放在下方,单选按钮放在textView的右侧) 创建时受保护的void(Bundle savedInstanceState) { ... connections=new ArrayList();//为连接创建ArrayList listView=(listView)findViewById(R.id.connectionsListView);//初始化列表视图 adap

似乎无法确定适配器的问题。我试图在
checkedTextView
下方放置一个进度条,以尽量减少元素数量和相对布局的麻烦(将加载条放在下方,单选按钮放在
textView
的右侧)

创建时受保护的void(Bundle savedInstanceState)
{
...
connections=new ArrayList();//为连接创建ArrayList
listView=(listView)findViewById(R.id.connectionsListView);//初始化列表视图
adapter=new P2PClientArrayAdapter(这个,android.R.layout.simple_List_item_single_choice,connections);//创建一个数组适配器
setAdapter(适配器);//将适配器连接到listView
listView.setChoiceMode(listView.CHOICE\u MODE\u SINGLE);
...
}

公共类P2PClientArrayAdapter扩展了ArrayAdapter
{
私有CheckedTextView CheckedTextView;
私人ProgressBar ProgressBar;
按下最后一个Radio按钮;
CheckedTextView lastPressedTextView;
公共P2PClientArrayAdapter(上下文上下文、int资源、列表客户端)
{
超级(上下文、资源、客户端);
lastRadioButtonPressed=-1;
lastPressedTextView=null;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
视图行=转换视图;
WifiP2pClient client=getItem(位置);
if(行==null)
{
LayoutInflater充气器=(LayoutInflater)getContext().getSystemService(Context.LAYOUT\u充气器\u SERVICE);
行=充气机。充气(R.layout.row\u布局,父级,false);
checkedTextView=(checkedTextView)row.findViewById(R.id.clientToString);
progressBar=(progressBar)row.findViewById(R.id.clientProgressBar);
row.setOnClickListener(新视图.OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
如果(位置!=上次按下RadioButton)
{
如果(lastPressedTextView!=null)
{
lastPressedTextView.setChecked(false);
}
lastRadioButtonPressed=位置;
lastPressedTextView=checkedTextView;
checkedTextView.setChecked(true);
p2pclientaryadapter.this.notifyDataSetChanged();
}
}
});
}
checkedTextView.setText(client.toString());
progressBar.setProgress(client.getProgress());
返回行;
}
}
目前,问题是适配器没有响应。我使用异步任务更新
WifiP2pClient
,并经常调用
notifydatasetchange()
,但UI中显示的数据从不更新。此外,当我按下
列表视图时,什么也没有发生(即使是正常的黑色按下动画)

如果改用常规的
ArrayListAdapter
对象,则
arrayList
会正确更新,因此我知道其余代码工作正常,这是因为
arrayAdapter
有问题

protected void onCreate(Bundle savedInstanceState)
{
...
    connections = new ArrayList<WifiP2pClient>();//make an arraylist for the connections
    listView = (ListView)findViewById(R.id.connectionsListView);//initialize the list view
    adapter = new P2PClientArrayAdapter(this, android.R.layout.simple_List_item_single_choice, connections);//create an array adapter
    listView.setAdapter(adapter);//attach the adapter to the listView
    listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
...
}
编辑:我根据以下帖子将
onClickListener()
放在
getView()
中:


EDIT2:我让适配器正确响应用户对它和按键所做的更改,方法是使用
ViewHolder
对象和视图的
setTag()
getTag()确保在视图不为空时正确更新
checkedViewText
progressBar
对象
功能。我将很快粘贴此代码。但是,我仍然没有让适配器为
getCheckedItemPosition()
返回正确的值。

在做了足够的实验并获得了一个幸运的机会之后,这是我完成的代码(为了将来的谷歌用户和比较起见)

公共类P2PClientArrayAdapter扩展了ArrayAdapter
{
//viewholder对象不是必需的,但它允许我们标记.set()
//没有标记,因为我们把它包在一个大物体里
私有类视窗持有者
{
CheckedTextView CheckedTextView;
ProgressBar ProgressBar;
}
按下最后一个Radio按钮;
CheckedTextView lastPressedTextView;
公共P2PClientArrayAdapter(上下文上下文、int资源、列表客户端)
{
超级(上下文、资源、客户端);
lastRadioButtonPressed=-1;
lastPressedTextView=null;
}
//我不确定如何覆盖ListView的getCheckEditePosition()
//所以我做了自己的,然后更改了调用代码。
public int getCheckedItemPosition()
{
返回上次按下的RadioButton;
}
//如果删除列表中的某个元素,则
//重置指针,否则将出现逻辑错误。
public void resetCheckEditePosition()
{
lastRadioButtonPressed=-1;
lastPressedTextView=null;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
视图行=转换视图;
WifiP2pClient client=getItem(位置);
最终持票人;
if(行==null)
{
LayoutInflater充气器=(LayoutInflater)getContext().getSystemService(Context.LAYOUT\u充气器\u SERVICE);
行=充气机。充气(R.layout.row\u布局,父级,false);
viewHolder=新的viewHolder();
viewHolder.checkedTextView=(checkedTextView)row.findViewById(R.id.clientToString);
viewHolder.progressBar=(progressBar)row.findViewById(R.id.clientProgressBar);
row.setTag(viewHolder);
}
其他的
{
viewHolder=(viewHolder)row.getTag();
}
row.setOnClickListen
public class P2PClientArrayAdapter extends ArrayAdapter<WifiP2pClient>
{
    private CheckedTextView checkedTextView;
    private ProgressBar progressBar;
    int lastRadioButtonPressed;
    CheckedTextView lastPressedTextView;
    public P2PClientArrayAdapter(Context context, int resource, List<WifiP2pClient> clients)
    {
        super(context, resource, clients);
        lastRadioButtonPressed = -1;
        lastPressedTextView = null;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        View row = convertView;
        WifiP2pClient client = getItem(position);
        if(row == null)
        {
            LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.row_layout, parent, false);

            checkedTextView = (CheckedTextView)row.findViewById(R.id.clientToString);
            progressBar = (ProgressBar)row.findViewById(R.id.clientProgressBar);

            row.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    if(position != lastRadioButtonPressed)
                    {
                        if(lastPressedTextView != null)
                        {
                            lastPressedTextView.setChecked(false);
                        }
                        lastRadioButtonPressed = position;
                        lastPressedTextView = checkedTextView;
                        checkedTextView.setChecked(true);
                        P2PClientArrayAdapter.this.notifyDataSetChanged();
                    }
                }
            });
        }
        checkedTextView.setText(client.toString());
        progressBar.setProgress(client.getProgress());
        return row;
    }
}
public class P2PClientArrayAdapter extends ArrayAdapter<WifiP2pClient>
{
    //The viewholder object isn't neccessary but it allows us to Tag.set()
    //with no indicies because we have it wrapped in one big object
    private class ViewHolder
    {
        CheckedTextView checkedTextView;
        ProgressBar progressBar;
    }

    int lastRadioButtonPressed;
    CheckedTextView lastPressedTextView;

    public P2PClientArrayAdapter(Context context, int resource, List<WifiP2pClient> clients)
    {
        super(context, resource, clients);
        lastRadioButtonPressed = -1;
        lastPressedTextView = null;
    }

    //I wasn't sure how to override ListView's getCheckedItemPosition()
    //So I made my own and then changed the calling code.
    public int getCheckedItemPosition()
    {
        return lastRadioButtonPressed;
    }
    //If you delete an element in your list, you have 
    //to reset the pointer or you'll have logic errors.
    public void resetCheckedItemPosition()
    {
        lastRadioButtonPressed = -1;
        lastPressedTextView = null;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        View row = convertView;
        WifiP2pClient client = getItem(position);

        final ViewHolder viewHolder;

        if(row == null)
        {
            LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.row_layout, parent, false);

            viewHolder = new ViewHolder();
            viewHolder.checkedTextView = (CheckedTextView)row.findViewById(R.id.clientToString);
            viewHolder.progressBar = (ProgressBar)row.findViewById(R.id.clientProgressBar);

            row.setTag(viewHolder);
        }
        else
        {
            viewHolder = (ViewHolder)row.getTag();
        }
        row.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if(position != lastRadioButtonPressed)
                {
                    if(lastPressedTextView != null)
                    {
                        lastPressedTextView.setChecked(false);
                    }
                    lastRadioButtonPressed = position;
                    lastPressedTextView = viewHolder.checkedTextView;
                    viewHolder.checkedTextView.setChecked(true);
                }
            }
        });
        viewHolder.checkedTextView.setText(client.toString());
        viewHolder.progressBar.setProgress(client.getProgress());
        return row;
    }
}