Munazza
Munazza

Reputation: 745

Centering the clicked item in listview in Android

I have a list view in left of the screen and on click of the item i want to update a text on the right half of the screen, what i want to do here is that to move the clicked item in center of the listview. Like if the item is on top and i click on it it automatically moves to the center of the list view, how I can do this? Any kind of help will be appreciated.

I have a listview in which 7 items are visible and on startup 4th item will be selected as this is in center of the visible items in listview and if there are n items and whichever item is selected by user will be in center of the visible items in listview. Like i have 10 items and on start 4th is selected and when user selects the 3rd item, nth item from listview should come to index zero and and 3rd will come to position 4. Similarly for every other selected item? Can any one provide a code snippet for this?

Upvotes: 2

Views: 1895

Answers (2)

Veaceslav Gaidarji
Veaceslav Gaidarji

Reputation: 4311

Change items order in ListView source Array and then call notifyDataSetChanged() in ListView Adapter

EDIT: Code sample

    public class ListAdapter extends BaseAdapter{


    private Activity activity;
    private ArrayList<ListRowObject> listItems;

    public ListAdapter(Activity activity){
        this.activity = activity;
        listItems = new ArrayList<ListRowObject>();
    }

    public void addItem(ListRowObject item){
        listItems.add(item);
        notifyDataSetChanged();
    }

    public void addItems(ArrayList<ListRowObject> items){
        listItems = items;
        notifyDataSetChanged();
    }

    public void clear(){
        listItems = null;
        listItems = new ArrayList<ListRowObject>();
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return listItems.size();
    }

    @Override
    public Object getItem(int position) {
        return listItems.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder holder;

        if(convertView == null){
            holder = new ViewHolder();
            convertView = activity.getLayoutInflater().inflate(R.layout.list_row, null);
            holder.text = (TextView) convertView.findViewById(R.id.text);
            holder.bgLayout = (LinearLayout) convertView.findViewById(R.id.bgLayout);

            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        ListRowObject row = listItems.get(position);

        if(row.isSelected())
            holder.bgLayout.setBackgroundColor(Color.GRAY);
        else
            holder.bgLayout.setBackgroundColor(Color.WHITE);

        holder.text.setText(row.getText());

        return convertView;
    }
}


    //--------
    public class ListRowObject {
    private String text;
    private int positionInList;
    private boolean isSelected;

    public String getText() {
        return text;
    }


    public void setText(String text) {
        this.text = text;
    }

    public int getPositionInList() {
        return positionInList;
    }

    public void setPositionInList(int positionInList) {
        this.positionInList = positionInList;
    }

    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
}

//------
public class Main extends Activity {

    private ListView listView;
    private ListAdapter adapter;
    private Activity activity;

    private ArrayList<ListRowObject> items;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        activity = this;

        initializeFormViews();
        initializeOnClickEvents();

        fillList();

    }

    private void initializeFormViews(){
        listView = (ListView) findViewById(R.id.listView);
    }

    private void initializeOnClickEvents(){
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                Toast.makeText(activity, "Pressed " +position, Toast.LENGTH_SHORT).show();

                // unselect all rows
                for(ListRowObject item : items){
                    item.setSelected(false);
                }

                int first = adapterView.getFirstVisiblePosition();
                int last = adapterView.getLastVisiblePosition();

                int centerPosition = (first + last) / 2;

                // change bg for centerPosition row
                adapterView.getChildAt(centerPosition).findViewById(R.id.bgLayout).setBackgroundColor(Color.GRAY);
                changeItems(position, centerPosition);
            }
        });
    }

    private void changeItems(int pressedPosition, int centerPosition){
        ListRowObject centerRow = items.get(centerPosition);
        ListRowObject pressedRow = items.get(pressedPosition);
        pressedRow.setSelected(true);
        centerRow.setSelected(false);

        items.remove(centerPosition);
        items.add(centerPosition, pressedRow);

        items.remove(pressedPosition);
        items.add(pressedPosition, centerRow);

        adapter.clear();
        adapter.addItems(items);
    }

    private void fillList(){
        adapter = new ListAdapter(activity);
        items = new ArrayList<ListRowObject>();

        items = getItems();

        for(ListRowObject item : items){
            adapter.addItem(item);
        }

        listView.setAdapter(adapter);
    }

    private ArrayList<ListRowObject> getItems(){
        ArrayList<ListRowObject> result = new ArrayList<ListRowObject>();

        for(int i = 0; i < 15; i++){
            ListRowObject object = new ListRowObject();
            object.setPositionInList(i);
            object.setText("Item #" + i);

            if(i != 4)
                object.setSelected(false);
            else
                object.setSelected(true);


            result.add(object);
        }

        return result;
    }
}

//------
public class ViewHolder {
    public TextView text;
    public LinearLayout bgLayout;
}

list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                          android:orientation="vertical"
                          android:layout_width="match_parent"
                          android:layout_height="50dp"
                          android:id="@+id/bgLayout">

        <TextView
                        android:layout_width="match_parent"
                        android:layout_height="50dp"
                        android:id="@+id/text"
                        android:textColor="#000000"
                        android:textSize="24dp"
                        android:gravity="center"/>
</LinearLayout>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                          android:orientation="vertical"
                          android:layout_width="match_parent"
                          android:layout_height="match_parent">

        <ListView
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:id="@+id/listView"/>
</LinearLayout>

Upvotes: 1

user1525382
user1525382

Reputation:

when you create ArrayAdapter for your listview you send a ListArray to it.when you want change content .you only change this listArray then when click your item you can change ListArray and call notifyDataSetChanged(); method your adapter.

Upvotes: 1

Related Questions