【问题标题】:ListView or LinearLayout - creating Buttons dynamicallyListView 或 LinearLayout - 动态创建按钮
【发布时间】:2014-12-16 00:42:25
【问题描述】:

当用户输入一个单词时,它会创建Buttons - 每个单词的字母一个Button

插图:

如果用户输入“so”,它会创建 2 个Buttons - 's', 'o'

如果用户输入“make”,它会创建 4 个Buttons - 'm', 'a', 'k', 'e'

我很难决定应该如何设计它。最终我决定做以下事情:每个单词都被添加到一个垂直的LinearLayout。并且对于每个单词,每个字母都添加到水平的LinearLayout。所以这是LinearLayout 中的LinearLayout 方法。

这是我创建的有效代码:

     //creates words dynamically
     public void makeNewWord(LinearLayout ll, View v, EditText e){

        //the horizontal linear layout
        LinearLayout linearLayout2 = new LinearLayout(v.getContext());
        linearLayout2.setOrientation(LinearLayout.HORIZONTAL);

        //the parameters for the horizontal linear layout                  
        LinearLayout.LayoutParams rlp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);    

        //e is the user input 
        int size = e.getText().toString().length();

        for (int i=0; i<size; i++){
             final Button dynamicButtons = new Button(v.getContext());
             dynamicButtons.setLayoutParams(rlp);

             //add the buttons to the horizontal linear layout 
             linearLayout2.addView(dynamicButtons, rlp);  
        }

        // ll is the vertical linear layout which I created in xml
        // so for each entered word, I am adding horizontal linear layouts to my vertical layout
        ll.addView(linearLayout2, 0);
    }

但现在我意识到使用ListView 可能更有效,尤其是因为我想让单词列表可扩展和可折叠。但是是否可以使用ListView 创建上面的插图?我该怎么做呢?

我尝试如下创建ArrayAdapterArrayAdapter&lt;LinearLayout&gt; adapter = new ArrayAdapter&lt;LinearLayout&gt;(this, R.id.listview)。所以基本上它将是水平LinearLayoutsListView。或者我应该改用ButtonsArrayAdapter 吗?正确的做法是什么?

【问题讨论】:

  • 我认为简单的答案是否定的。您不能使用列表视图来做到这一点,因为一旦您编写了自定义适配器,您就需要有一个列表项视图才能将其作为参数。该列表项视图是静态的 - 通常使用 XML 文件完成。我认为仅实现一种使用您所拥有的手动滚动屏幕的方法会容易得多 - 这真的一点也不难!
  • 滚动很容易。但我希望我的单词列表也可以折叠和扩展。我听说可以创建一个可扩展的 ListView。 -- 我编辑了上面的帖子,不包括关于滚动的评论。我留下了关于扩展和折叠的部分,因为这是最重要的部分

标签: android listview android-linearlayout android-arrayadapter


【解决方案1】:

我可以给出一些想法,你可以在代码中转换这个想法

     1. onTextChanged() method try to get length of text.
     2. If you able to get text length then by subString() method get last entered text
     3. Then recreate new button instance 

【讨论】:

    【解决方案2】:

    您可以为此使用 TableLayout。

    test.xml

    <ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
    
        <TableLayout
            android:id="@+id/table_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
        </TableLayout>
    
    </ScrollView>
    

    活动代码

    private TableLayout tableLayout;
    private HashMap<String, TableRow> tableRows;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.test);
        super.onCreate(savedInstanceState);
    
        tableLayout = (TableLayout) findViewById(R.id.table_layout);
        tableRows = new HashMap<String, TableRow>();
    }
    
    public void addWord(String word) {
        if (!tableRows.containsKey(word)) {
            TableRow tableRow = new TableRow(this);
    
            for (int i = 0; i < word.length(); i++) {
                String letter = String.valueOf(word.charAt(i));
    
                Button btnLetter = new Button(this);
                btnLetter.setText(letter);
                tableRow.addView(btnLetter);
            }
    
            tableRows.put(word, tableRow);
            tableLayout.addView(tableRow);
        }
    }
    
    public void removeWord(String word) {
        TableRow tableRow = tableRows.remove(word);
    
        if (tableRow != null) {
            tableLayout.removeView(tableRow);
        }
    }
    
    public void showWord(String word) {
        TableRow tableRow = tableRows.get(word);
    
        if (tableRow != null) {
            tableRow.setVisibility(View.VISIBLE);
        }
    }
    
    public void hideWord(String word) {
        TableRow tableRow = tableRows.get(word);
    
        if (tableRow != null) {
            tableRow.setVisibility(View.GONE);
        }
    }
    

    假设您想要一个特定的按钮设置,您可以动态扩展 xml 按钮布局。详情请见here

    【讨论】:

      【解决方案3】:

      我只会使用每个单词的水平列表视图。 我想你创建一个自定义布局管理器和新的 RecyclerView。

      您单词的每个字符都将成为列表视图中的一个项目。然后布局可以只是一个按钮。

      class ListAdapter extends BaseAdapter {
      
          private final Context fContext;
          private String mWord;
      
          public ListAdapter(Context context) {
              fContext = context;
      
          }
      
          public void updateWord(String word) {
              mWord = word;
              notifyDataSetChanged();
          }
      
          @Override
          public int getCount() {
              return mWord == null ? 0 : mWord.length();
          }
      
          @Override
          public String getItem(int position) {
              return String.valueOf(mWord.charAt(position));
          }
      
          @Override
          public long getItemId(int position) {
              return position;
          }
      
          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
              Button button;
              if (convertView == null) {
                  button = new Button(parent.getContext());
      
                  LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                  button.setLayoutParams(params);
              } else {
                  button = (Button) convertView;
              }
              button.setText(getItem(position));
              return button;
          }
      }
      

      在每次文本更改时,您都可以更新列表。

      adapter.updateWord();
      

      请注意,代码只是我的想法,我还没有测试过,但应该足以给你和想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 2020-10-30
        • 2017-06-01
        相关资源
        最近更新 更多