Java 列表视图性能单击不';行不通

Java 列表视图性能单击不';行不通,java,android,listview,background,onitemclick,Java,Android,Listview,Background,Onitemclick,我试图在片段首次启动时手动调用onItemClick,但它的行为与预期不符。它在onCreateView()方法中被调用,如下所示: public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { handler=new DBHandler(getActivity().getApplica

我试图在片段首次启动时手动调用onItemClick,但它的行为与预期不符。它在onCreateView()方法中被调用,如下所示:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        handler=new DBHandler(getActivity().getApplicationContext(),null,null,1);
        JustaMap=new HashMap<String,List<MediaMetadata>>();
        app = new Common();
        rootView = inflater.inflate(R.layout.fragment_create_playlist, container, false);
        musicProvider = new MusicProvider();
        SongTitles = new ArrayList<String>();
        PlayList = new ArrayList<MediaMetadata>();
        musicProvider.buildSongFromDevice();
        SongList = (List<MediaMetadata>) musicProvider.getAllMusics();
        Iterator<MediaMetadata> iterator = SongList.iterator();
        while (iterator.hasNext())
            SongTitles.add(iterator.next().getDescription().getTitle().toString());

        listView = (ListView) rootView.findViewById(R.id.listView);
        editText = (EditText) rootView.findViewById(R.id.PlaylistName);
        button = (Button) rootView.findViewById(R.id.submit);
        adapter = new CustomAdapter(getActivity().getApplicationContext(), SongTitles);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {

                MediaMetadata SongSelected = SongList.get(position);
                view.setSelected(true);
                if (view.getBackground() == null) {
                    view.setBackgroundResource(R.color.light_grey);
                    if (!Arrays.asList(PlayList).contains(SongSelected))
                        PlayList.add(SongSelected);
                } else {
                    view.setBackgroundResource(0);
                    PlayList.remove(SongSelected);
                }

            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // createPlaylist();
            }
        });


        listView.performItemClick(
                listView.getAdapter().getView(2,null,null),2,listView.getAdapter().getItemId(2));

        return rootView;
    }
public View onCreateView(布局、充气机、视图组容器、,
Bundle savedInstanceState){
handler=newdbhandler(getActivity().getApplicationContext(),null,null,1);
JustaMap=newhashmap();
app=新的通用();
rootView=充气机。充气(R.layout.fragment\u create\u播放列表,容器,false);
musicProvider=新的musicProvider();
SongTitles=新的ArrayList();
PlayList=newarraylist();
musicProvider.buildSongFromDevice();
SongList=(List)musicProvider.getAllMusics();
迭代器迭代器=SongList.Iterator();
while(iterator.hasNext())
添加(iterator.next().getDescription().getTitle().toString());
listView=(listView)rootView.findViewById(R.id.listView);
editText=(editText)rootView.findViewById(R.id.playliName);
button=(button)rootView.findviewbyd(R.id.submit);
adapter=新的CustomAdapter(getActivity().getApplicationContext(),SongTitles);
setAdapter(适配器);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView AdapterView,视图视图,整型位置,长id){
MediaMetadata-SongSelected=SongList.get(位置);
view.setSelected(true);
if(view.getBackground()==null){
视图.背景资源(R.颜色.浅灰色);
如果(!Arrays.asList(PlayList).contains(SongSelected))
播放列表。添加(选定歌曲);
}否则{
查看。setBackgroundResource(0);
播放列表。删除(选定歌曲);
}
}
});
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//创建播放列表();
}
});
listView.performItemClick(
getAdapter().getView(2,null,null),2,listView.getAdapter().getItemId(2));
返回rootView;
}

基本上,当点击项目时,它的背景应该变为灰色,但当片段启动时,它仍然是白色的。我使用了一个调试器来逐步执行,仍然会调用onItemClick(),但背景不会改变。但是,如果我在列表项上执行实际的单击,它实际上会工作,并且颜色会按预期变化。调用performItemClick()后,视图的背景似乎被设置回null,但实际单击时却没有设置。为什么会发生这种情况?

您可以跟踪当前选定元素的位置:

OnItemClickListener listViewOnItemClick = new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
        mSelectedItem = position;
        mAdapter.notifyDataSetChanged();
    }
};

首先,您可以在可绘图文件夹drawable/list\u item\u selector.xml中创建选择器xml文件,如下所示

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_activated="true">
      <shape android:shape="rectangle">
        <solid android:color="#333333" />
        <padding android:left="5dp" android:right="5dp" />
      </shape></item>
    <item><shape android:shape="rectangle">
            <solid android:color="#222222" />
        </shape></item>

</selector>

可以跟踪当前选定图元的位置:

OnItemClickListener listViewOnItemClick = new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
        mSelectedItem = position;
        mAdapter.notifyDataSetChanged();
    }
};

首先,您可以在可绘图文件夹drawable/list\u item\u selector.xml中创建选择器xml文件,如下所示

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_activated="true">
      <shape android:shape="rectangle">
        <solid android:color="#333333" />
        <padding android:left="5dp" android:right="5dp" />
      </shape></item>
    <item><shape android:shape="rectangle">
            <solid android:color="#222222" />
        </shape></item>

</selector>
试着替换

listView.performItemClick(
                listView.getAdapter().getView(2,null,null),2,listView.getAdapter().getItemId(2));

此外,performItemClick之前的这两行代码会产生选中列表项的错觉。它们还确保屏幕上有相应的项目。

尝试更换

listView.performItemClick(
                listView.getAdapter().getView(2,null,null),2,listView.getAdapter().getItemId(2));
listView.getAdapter().getView(your position, null, null).performClick();

Toast.makeText(this, ""+ listView.performItemClick(
                                         listView.getAdapter().getView(your position, null, null), your position, your position) , Toast.LENGTH_SHORT).show(); 

此外,performItemClick之前的这两行代码会产生选中列表项的错觉。它们还确保屏幕上显示适当的项目

listView.getAdapter().getView(your position, null, null).performClick();

Toast.makeText(this, ""+ listView.performItemClick(
                                         listView.getAdapter().getView(your position, null, null), your position, your position) , Toast.LENGTH_SHORT).show(); 
这个代码对我有用


这段代码对我有效

谢谢第一种方法有效!有关于发生了什么的解释吗?您在视图上执行操作,而它应该在listview的adapterview或特定(选定)子视图上执行。感谢第一种方法有效!有什么解释吗?您正在对视图执行操作,而该操作应在listview的adapterview或特定(选定)子视图中执行。