Search code examples
javaandroidandroid-listview

How to get specific view and change attributes from custom listview?


I'm creating a custom listview with two views: an Imageview and a TextView. All works well, but i want to access specific positions of the listview in order to change visibility.

I tried this method but it doesn't work.

private void updateView(int index){
//        View v = mListView.getChildAt(index-mListView.getFirstVisiblePosition());

        View v = mListView.getAdapter().getView(index-mListView.getFirstVisiblePosition(), null, mListView);
        if (v==null){ return; }
        ImageView imageView = Objects.requireNonNull(v).findViewById(R.id.listview_image);
        imageView.setAlpha(0.2f);
        imageView.setVisibility(View.GONE);
    }

This is all my code:

package com.example

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.media.Image;
import android.preference.PreferenceManager;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import com.taozen.quithabit.MainActivity;
import com.taozen.quithabit.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;

public class AchievmentsActivity extends AppCompatActivity {

//    public static void main(String[] args) { }

    // Array of strings for ListView Title
    String[] titles = new String[] {
            "Recruit lvl I", "Recruit lvl II", "Recruit lvl III", "Recruit Master",
            "Silver lvl I", "Silver lvl II", "Silver lvl III", "Silver Nova Master",
            "Gold lvl I", "Gold lvl II", "Gold lvl III", "Gold lvl IV", "Gold Nova Master"};

    int[] images = new int[] {
            R.mipmap.chevron7, R.mipmap.chevron8, R.mipmap.chevron9, R.mipmap.chevron11,
            R.mipmap.chevron16, R.mipmap.chevron17, R.mipmap.chevron18, R.mipmap.chevron10,
            R.mipmap.chevron3, R.mipmap.chevron4, R.mipmap.chevron5, R.mipmap.chevron6, R.mipmap.chevron12};

    String[] descriptions = new String[] {
            "Android ListView Short Bronze LvL I", "Android ListView Short Bronze LvL II", "Android ListView Short Bronze LvL III", "Android ListView Short Bronze LvL IV",
            "Android ListView Short Silver LvL I", "Android ListView Short Silver LvL II", "Android ListView Short Silver LvL III", "Android ListView Short Silver LvL IV",
            "Android ListView Short Description", "Android ListView Short Description", "Android ListView Short Description", "Android ListView Short Description",
    "Only for those who are worthy!"};

    //shared pref
    private SharedPreferences preferences;
    private SharedPreferences.Editor editor;

    HashMap<String, String> hm;
//    SimpleAdapter simpleAdapter;
    ListView mListView;

    @SuppressLint("CommitPrefEdits")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_achievments);

        //shared pref
        preferences = PreferenceManager.getDefaultSharedPreferences(AchievmentsActivity.this);
        editor = preferences.edit();

        getWindow().setStatusBarColor(ContextCompat.getColor(AchievmentsActivity.this, R.color.white));
        //TOOLBAR
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

//        List<HashMap<String, String>> aList = new ArrayList<>();
//
//        for (int i = 0; i < images.length; i++) {
//            hm = new HashMap<>();
//            hm.put("listview_title", titles[i]);
//            hm.put("listview_discription", descriptions[i]);
//            hm.put("listview_image", Integer.toString(images[i]));
//            aList.add(hm);
//        }

        mListView = findViewById(R.id.list_view);
        CustomAdapterListView customAdapterListView = new CustomAdapterListView(this, titles, images);
        mListView.setAdapter(customAdapterListView);



        if (preferences.contains("rank")){
            if (Objects.requireNonNull(preferences.getString("rank", "")).equalsIgnoreCase("Recruit")) {
                updateView(3);
            }
        }
    }

    private void updateView(int index){
//        View v = mListView.getChildAt(index-mListView.getFirstVisiblePosition());

        View v = mListView.getAdapter().getView(index-mListView.getFirstVisiblePosition(), null, mListView);
        if (v==null){ return; }
        ImageView imageView = Objects.requireNonNull(v).findViewById(R.id.listview_image);
        imageView.setAlpha(0.2f);
        imageView.setVisibility(View.GONE);
    }

    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }
    class CustomAdapterListView extends BaseAdapter {
        String [] result;
        Context context;
        int [] imageId;
        private LayoutInflater inflater=null;
        public CustomAdapterListView(AchievmentsActivity mainActivity, String[] prgmNameList, int[] prgmImages) {
            // TODO Auto-generated constructor stub
            result=prgmNameList;
            context=mainActivity;
            imageId=prgmImages;
            inflater = ( LayoutInflater )context.
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        public int getCount() {
            return images.length;
        }
        @Override
        public Object getItem(int position) {
            return position;
        }
        @Override
        public long getItemId(int position) {
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Holder holder=new Holder();
            View view;
            view = inflater.inflate(R.layout.list_item, null);
            holder.img = view.findViewById(R.id.listview_image);
            holder.tv = view.findViewById(R.id.listview_item_title);
            holder.img.setImageResource(images[position]);
            holder.tv.setText(titles[position]);
            return view;
        }
    }
    public class Holder {
        TextView tv;
        ImageView img;
    }

}

For example: If preferences contains "rank" then i want to setAlpha(0.2f) to positions 0 to 5 from my listview.


Solution

  • According to your code you need to add the following lines to the end of your getView method of

    CustomAdapterListView

        if (Objects.requireNonNull(preferences.getString("rank", "")).equalsIgnoreCase("Recruit")
                && position <= 5) //will check the item position
        {
            //setAlpha or do anything you want if the Rank is Recruit and position is lesser or equal to 5
            holder.img.setAlpha(0.2f);
        } else
        {
            //else do the remaining part
        }
    
        return view;