首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android的listview中将点击的项目居中

在Android的listview中将点击的项目居中
EN

Stack Overflow用户
提问于 2012-12-26 18:38:17
回答 2查看 1.8K关注 0票数 2

我在屏幕的左侧有一个列表视图,在单击项目时,我想要更新屏幕右半部分的文本,这里我想做的是将单击的项目移动到列表视图的中心。例如,如果项目在顶部,我单击它,它会自动移动到列表视图的中心,我如何做到这一点?任何形式的帮助都将不胜感激。

我有一个列表视图,其中7个项目是可见的,在启动时,第4个项目将被选中,因为这是在列表视图中可见项目的中心,如果有n个项目,无论用户选择哪个项目,都将位于列表视图中可见项目的中心。比如我有10个项目,在开始时选择了第4个项目,当用户选择第3个项目时,列表视图中的第n个项目应该到索引0,第3个项目将到位置4。有人能为此提供一个代码片段吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-26 18:41:12

ListViewArray中更改项目顺序,然后在ListView Adapter中调用notifyDataSetChanged()

编辑:代码示例

代码语言:javascript
复制
    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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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>
票数 1
EN

Stack Overflow用户

发布于 2012-12-26 18:46:13

当您为您的列表视图创建ArrayAdapter时,您向it.when发送了一个ListArray,您希望更改content .you只更改此listArray,然后当单击您的项目时,您可以更改ListArray并调用notifyDataSetChanged();方法您的适配器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14039387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档