Показать галочку в выбранном элементе ListView - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь создать экран выбора языка. У меня ListView, и я использую пользовательский класс адаптера. После выбора элемента я хочу показать отметку в нем. Мои ListView имеют TextView и ImageView. Как этого добиться?

Вот что я уже пробовал.

public class customAdapter extends BaseAdapter {

    String[] languages ;
    Context mContext;
    boolean isChecked = false;

    public customAdapter(String[] languages, Context mContext) {
        this.languages = languages;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        return languages.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView=  inflater.inflate(R.layout.content_lang_list,parent,false);

        TextView lang_text = (TextView) rowView.findViewById(R.id.text_select_lang);
        final ImageView image_tick = (ImageView) rowView.findViewById(R.id.image_tick);

        lang_text.setText(languages[position]);
        image_tick.setImageResource(R.drawable.ic_checked);

        return rowView;

    }



public class ChangeLang extends AppCompatActivity {

    private ListView languageList;
    String[] languages = {"English","Portuguese","Arabic"};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cahnge_lang);

        languageList = (ListView) findViewById(R.id.language_list);
        final customAdapter mAdapter = new customAdapter(languages,this);
        languageList.setAdapter(mAdapter);

        languageList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String selected = ((TextView) view.findViewById(R.id.text_select_lang)).getText().toString();
                Object itemObject = parent.getAdapter().getItem(position);
                LanguageSelect selectedLang = (LanguageSelect)itemObject;



            }
        });
    }
}

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Как экран выбора языка, я предполагаю, что вам нужно выбирать только один элемент за раз.Вы уже добавили логический элемент isChecked;, но, кажется, нигде не используются.

Шаг 1:

Здесь вам нужен элемент int - скажем, selectedItemPosition, начальное значение которого установлено как -1.Другими словами, замените

boolean isChecked = false;

на

int selectedItemPosition = -1;

Шаг 2:

Добавьте это к onItemClick()

selectedItemPosition = ((selectedItemPosition!=position)?position:-1);
notifyDataSetChanged();

Шаг 3:

Добавьте это к вашему getView()

image_tick.setVisibility((selectedItemPosition=position)?View.VISIBLE:View.GONE);

Несколько советов:

  • При использовании ListViews, следуйте шаблону держателя вида для оптимизации производительности.
  • Используйте convertView s дляrecycle views.
  • Вы можете заменить image_tick.setImageResource(R.drawable.ic_checked); на android:src="R.drawable.ic_checked" в XML.
0 голосов
/ 25 августа 2018

Используйте setVisibility(View.VISIBLE); в элементе изображения, по которому щелкнули!т.е.:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView=  inflater.inflate(R.layout.content_lang_list,parent,false);

    TextView lang_text = (TextView) rowView.findViewById(R.id.text_select_lang);
    final ImageView image_tick = (ImageView) rowView.findViewById(R.id.image_tick);

    lang_text.setText(languages[position]);
    image_tick.setImageResource(R.drawable.ic_checked);
    image_tick.setVisibility(View.VISIBLE); //Show image
    return rowView;

}
...