Обновление изображения пользовательского списка массивов Android - PullRequest
0 голосов
/ 10 марта 2012

У меня есть собственный список массивов, который подключен к адаптеру и пользовательский XML для каждой строки моего списка массивов. Нажав на элемент, я сделал предупреждение для строителя строк, и когда я его подтвердил, я бы хотел изменить изображение, отображаемое в пользовательском списке массивов. До сих пор я не смог каким-то образом обновить список новым изображением в выбранном элементе. Вы знаете, как это можно сделать? Есть ли способ, как отследить, какое место в списке было нажато? Является ли метод возобновления и какое-то «перерисовывание» лучшим решением?

Спасибо

Редактировать: Добавлен код для используемого адаптера:

public class datamanagerAdapter extends ArrayAdapter<mapObject>{
private ArrayList<mapObject> items;
 private Context ctx;
 String rememberName="";

public datamanagerAdapter(Context context, int textViewResourceId, ArrayList<mapObject> items) {
    super(context, textViewResourceId, items); 
    this.items = items;
    this.ctx = context;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
        View v = convertView;


        if (v == null) {
            LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);
        }
        final mapObject mo = items.get(position);
        if (mo != null) {
                ImageView imv = (ImageView) v.findViewById(R.id.selected);
                TextView one = (TextView) v.findViewById(R.id.mapname);
                TextView two = (TextView) v.findViewById(R.id.map_contains);
                TextView three = (TextView) v.findViewById(R.id.map_size);

                if (one != null) {
                      one.setText(""+mo.getMapName());                            
                }
                if(two != null){
                      two.setText(""+ mo.getMapContains());
                }
                if(three != null){
                    three.setText("Size: "+ mo.getMapSize()+"MB     POI: "+mo.getMapContainsPoi()+"");
                }
                if (imv != null) {
                    imv.setImageDrawable(mo.getImage());  
                }else{
                    imv.setImageDrawable(v.getResources().getDrawable(R.drawable.cross)); 
                }

                v.setOnClickListener(new OnClickListener() {
                    public void onClick(View arg0) {

                            showDetails(mo, ctx);
                    }

                    private void showDetails(final mapObject mo, final Context ctx) {
                        final Context mContext = ctx.getApplicationContext();
                        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
                        final View layout = inflater.inflate(R.layout.custom_dialog,null);
                        AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
                        builder.setView(layout);

                        final AlertDialog alertDialog  = builder.create();

                        TextView l1=(TextView) layout.findViewById(R.id.lineone);
                        TextView l2=(TextView) layout.findViewById(R.id.linetwo);
                        TextView l3=(TextView) layout.findViewById(R.id.linethree);
                        TextView l4=(TextView) layout.findViewById(R.id.linefour);
                        TextView l5=(TextView) layout.findViewById(R.id.linefive);
                        TextView l6=(TextView) layout.findViewById(R.id.linesix);
                        TextView l7=(TextView) layout.findViewById(R.id.lineseven);

                        Button select=(Button) layout.findViewById(R.id.selectActiveMap);
                        Button cancel=(Button) layout.findViewById(R.id.closeWindowButton);

                        rememberName=mo.getMapName();

                        l1.setText("...");
                        l2.setText("Map: "+mo.getMapName());
                        l3.setText("Covered Area: "+mo.getMapContains());
                        l4.setText("Size: "+mo.getMapSize()+" MB");
                        l5.setText("POI: "+mo.getMapContainsPoi());
                        l6.setText("Source: "+mo.getMapSource());
                        l7.setText("Version: "+mo.getMapVersion());

                        select.setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View v) {
                            //here I want to change image which is displayed in the list. If I select this map, I ant to have displayed "tick" better than a "cross" which is used by default.  


                                }
                                alertDialog.dismiss();



                            }
                        });

                        cancel.setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View v) {
                                alertDialog.dismiss();

                            }
                        });





                        alertDialog.show();
                    }
                });
        }
        return v;       
}

}

1 Ответ

1 голос
/ 11 марта 2012

Код вашего getView() метода - беспорядок, метод должен быть таким, как этот:

@Override
        public View getView(final int position, View convertView,
                ViewGroup parent) {
            View v = convertView;

            if (v == null) {
                LayoutInflater vi = (LayoutInflater) ctx
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.stacktest3_row, null);
            }
            final mapObject mo = items.get(position);
            if (mo != null) {
                ImageView imv = (ImageView) v.findViewById(R.id.selected);
                TextView one = (TextView) v.findViewById(R.id.mapname);
                TextView two = (TextView) v.findViewById(R.id.map_contains);
                TextView three = (TextView) v.findViewById(R.id.map_size);

                if (one != null) {
                    one.setText("" + mo.getMapName());
                }
                if (two != null) {
                    two.setText("" + mo.getMapContains());
                }
                if (three != null) {
                    three.setText("Size: " + mo.getMapSize() + "MB     POI: "
                            + mo.getMapContainsPoi() + "");
                }
                if (imv != null) {
                    imv.setImageDrawable(mo.getImage());
                } else {
                    imv.setImageDrawable(v.getResources().getDrawable(
                            R.drawable.cross));
                }

            }
            return v;
        }

Если вы хотите прослушивать щелчок строки списка, вам придется реализовать либо метод onListItemClick(ListView l, View v, int position, long id), если вы расширяете ListActivity, либо установить setOnItemClickListener() для вашего элемента ListView, если вы расширяете Activity. Тогда в методе onItemClick():

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    mapObject item = l.getItemAtPosition(position);
            showDetails(item, context); //see what context you can use           
}

затем в кнопке выбора:

select.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        //If you want to change the image then put your new image(or drawable or what ever) or id in the ITEM mapObject that you pass to the method showDetails() then call notifyDataSetChanged() on your adapter object
         alertDialog.dismiss(); 
        }
    });
...