android的ListView点击事件问题?
天蓬老师
天蓬老师 2017-04-17 17:41:00
0
4
375

当我在写一个android应用的时候遇到了这样一个需求:

有个ListView,里面的item都有图片和文字,当一个item被点击的时候显示在此item上显示图片和一个进度条,当另一个item被点击的时候隐藏上一次被电击item的图片和进度条,显示当前被点击item的图片和进度条

我的有关代码是这样的,用的是simpleAdapter

我的思路是就这样的,先把ListView的所有item遍历,隐藏我该隐藏的控件,然后显示当前被点击item的要显示的控件(progressbar和playing_effect)

不过问题出现了,点击之后的效果特别卡,不知道怎么回事点击40-50次之后就出现手机内存不足的情况,难道我的思路一开始是错误的吗?还是需要优化?耗内存是怎么回事啊

谢谢






public class MainActivity extends AppCompatActivity {



    ArrayList<Boolean> itemState = new ArrayList<>();
    int checkedItemIndex = -1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        for (int s=0;s<20;s++){
            itemState.add(false);
        }


        class AudioListAdapter extends SimpleAdapter{

            public AudioListAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
                super(context, data, resource, from, to);
            }
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View v = super.getView(position, convertView, parent);
                //
                if (itemState.get(position)){
                    // 设置点击状态
                    v.findViewById(R.id.progressBar).setVisibility(View.VISIBLE);
                    v.findViewById(R.id.playing_effect).setVisibility(View.VISIBLE);
                }else {
                    // 设置未点击状态
                    v.findViewById(R.id.progressBar).setVisibility(View.GONE);
                    v.findViewById(R.id.playing_effect).setVisibility(View.GONE);
                }
                //

                return v;
            }
        }



        final ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
        for (int i = 0; i < 10; i++){
            HashMap<String,Object> map = new HashMap<String, Object>();
            map.put("song","song name "+i);
            map.put("singer","singer "+i);
            map.put("currentTime","01:3"+i);
            map.put("allTime","04:5"+i);

            listItem.add(map);
        }

        final ListView listView = (ListView)findViewById(R.id.listView);
        final AudioListAdapter audioListAdapter = new AudioListAdapter(
                this,
                listItem,
                R.layout.item,
                new String[]{"song","singer","currentTime","allTime"},
                new int[]{R.id.song,R.id.singer,R.id.currentTime,R.id.allTime}
        );

        listView.setAdapter(audioListAdapter);

        // onclick
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //
                if (checkedItemIndex>=0){
                    itemState.set(checkedItemIndex,false);
                }
                checkedItemIndex = position;
                itemState.set(position,true);
                audioListAdapter.notifyDataSetChanged();
                //
            }
        });

    }

    @Override
    public void onStart(){
        super.onStart();
    }

}

上面我把所有代码给贴出来的,我按楼下回复里的想法去做的,我发现结果同样很卡,内存耗得更快,大神们看一下吧

谢谢

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

모든 응답(4)
洪涛

위의 두 사람은 목록을 직접 유지 관리하고 getView에서 목록 상태에 따라 다른 View를 그리는 것을 더 명확하게 설명했습니다.
이전 방법은 모든 itemView의 인스턴스를 순회하고 생성해야 하므로 CPU와 메모리에 많은 부담을 주므로 항목 수를 알 수 없는 경우 순회하지 않고 저장하는 것이 가장 좋습니다. 마지막 클릭이 됩니다.
방금 다음과 같은 유사 코드를 작성했습니다

으아악

------------구분선------------ ------ ----
getView 부분의 코드에 문제가 있습니다. 여기서는 ConvertView를 생성/재사용해야 합니다

刘奇

내 생각을 말씀드리겠습니다.
클릭할 때마다 항목의 클릭 상태를 어댑터에 저장하면 어댑터에서 특정 항목의 특정 속성만 업데이트하면 됩니다. 그런 다음 이 속성을 기반으로 getView에서 다른 처리를 수행합니다.

Peter_Zhu

listView 어댑터의 getView 메소드에 표시/숨기기 로직을 ​​작성하고, 클릭 시 통지DataSetChanged를 호출하면 됩니다

黄舟

3층의 정답은 새로운 부울 리스트를 생성하여 각 아이템의 상태를 저장하는 것입니다. 클릭할 때마다 먼저 아래 첨자 currentitemindex의 아이템 속성을 false로 변경하고, 아래 첨자의 아이템 속성을 설정해 주면 됩니다. 사실로 위치. 그런 다음 현재 항목 인덱스를 업데이트하세요. 마지막으로 어댑터를 새로 고치세요

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿