ListView setText在特定位置

时间:2016-06-22 13:25:35

标签: android listview android-adapter baseadapter android-viewholder

我定义了以下代码,以便能够在特定位置设置文本。

<div class="primary_nav_wrap">
  <ul>
    <li class="current-menu-item"><a href="#">Home</a>
    </li>
    <li>
      <a href="#">Menu 1</a>
      <div class="sub_divsavedfun" id="Functions_1-5">
        <ul>
          <li><a href="#">Sub Menu 1</a>
          </li>
          <li><a href="#">Sub Menu 2</a>
          </li>
          <li><a href="#">Sub Menu 3</a>
          </li>
          <li>
            <a href="#">Sub Menu 4</a>
            <ul>
              <li>
                <a href="#">Deep Menu 1</a>
                <ul>
                  <li><a href="#">Sub Deep 1</a>
                  </li>
                  <li><a href="#">Sub Deep 2</a>
                  </li>
                  <li><a href="#">Sub Deep 3</a>
                  </li>
                  <li><a href="#">Sub Deep 4</a>
                  </li>
                </ul>
              </li>
              <li><a href="#">Deep Menu 2</a>
              </li>
            </ul>
          </li>
          <li><a href="#">Sub Menu 5</a>
          </li>
        </ul>
      </div>
    </li>
  </ul>
</div>

我想要检查位置是否等于0,然后如果是,则在位置p上设置文本 - 每次它的位置+ 1(下一个位置)。 我们是否能够将文本从持有者设置为文本视图,但是在某个位置。

感谢。

6 个答案:

答案 0 :(得分:7)

我认为您仍在使用ListView,如果不是,请更新问题标题。

getView(int position, View convertView, ViewGroup parent)方法中,检查要为其创建视图的位置。既然你已经在使用holder,我假设你在提取持有者之前已经完成了(convertView!= null)检查。

在getView(int position,View convertView,ViewGroup parent)中,您可以检查

if (position == 0) {
    holder.text.setText("blah");
} else {
    holder.text.setText("");
}

请记住,else部分是必需的,因为视图往往会被重用,因此您的早期“blah”需要重置,否则在您的视图滚动时将在其他视图中可见。

有关视图重用方式的详细说明,您可以查看其中的great talk Romain Guy,它解释了有关ListView的所有内容。

答案 1 :(得分:3)

首先,您需要在Adapter中实现自己的RecyclerView.Adapter,您需要实现onBindViewHolder()方法,您可以根据位置指定文本。

当位置为0时,您将获得一些文本并将其保存到String字段中,当位置为1时,您可以相应地设置该TextView的文本。

public class CustomAdapter extends RecyclerView.Adapter {

private String tempText;

...

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if(position == 0) {
        tempText = "bla";
    }else if (position == 1){

        holder.text.setText(tempText);
    }
}

}

答案 2 :(得分:1)

请注意!使用RecycleView,他使每个操作的所有视图无效,并具有缓存视图的机制。 更改视图可能会产生问题!

更好的解决方案,它使用您自己的适配器。 或者,最佳解决方案,它使用适配器执行此任务 - LinkedListView与RecycleView一样,也可以随时支持更改视图。

答案 3 :(得分:1)

您需要更新列表数据在getView()方法中,不要担心位置,因为它会自动增加。

 public class ViewHolder
    {
        TextView text;
    } 

public View getView(final int position, View rView, ViewGroup parent)
    {
        currentPosition = position;
        rowView =rView;


        if(rowView == null)
        {
            LayoutInflater inflater = LayoutInflater.from(context);
            rowView= inflater.inflate(R.layout.list_item_layout, null);
            viewHolder = new ViewHolder();

            viewHolder.text= (TextView) rowView.findViewById(R.id.textView);

            rowView.setTag(viewHolder);
        }
        else
        {
            viewHolder = (ViewHolder) rowView.getTag();
        }
       if(position==0){
             viewHolder.text.setText("your Text");
        }
        else if(position==1){
             viewHolder.text.setText("your Text 1");
        }
        notifyDataSetChanged();//this will update your views
}

答案 4 :(得分:0)

在CustomAdapter.class中添加此代码

<Component Guid="3B413DBB-603B-42BA-80A6-BA8ED5216ACE" Id="FornetDB" Directory="DirIIS" KeyPath="yes">

  <sql:SqlScript BinaryKey="SQLCreateScript" ExecuteOnInstall="yes" SqlDb="MasterDB"  Id="CreateScript" />
</Component>
<sql:SqlDatabase Database="Master"
                       Server="TUSHAR"
                       Instance="SQLSERVER2008R2"
                       Id="MasterDB"
                       ></sql:SqlDatabase>

在您的MainActivity.class

点击textview并更改值

public View getView(final int position, View convertView, final ViewGroup parent) {
ViewHolder holder = new ViewHolder();
        holder.txtDetails = (TextView) vi.findViewById(R.id.txt_expenses_details);
        holder.txtDetails.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ListView) parent).performItemClick(v, position, 0);
            }
        });
        vi.setTag(holder);
        return vi;
}

单击列表视图并更改值                          (或)

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            long viewId = view.getId();
            if (viewId == R.id.txt_expenses_details) {
                ((TextView)view).setText("Hey, I've just been tapped on!");
                customListAdapter.notifyDataSetChanged();
            }
        }
    });

答案 5 :(得分:0)

我认为在特定位置设置文本的方法是错误的。更好的代码实践是改变数据。假设您的数据结构类似于 -

class MyData{
    public String status;
}
ArrayList<MyData> adapterList;

现在,如果您有适用于适配器的MyData列表,并且您想要更改第5个数据,那么请执行此操作 -

private void updatePostion(positionToChange = 5){ 
    for(int i = 0; i < adapterList.size(); i++)
          adapterList.get(i).status = "";
    adapterList.get(positionToChange).status = "blah";
    notifyDataSetChanged();
}

希望它会对你有所帮助:)。