【问题标题】:multiple listview are being cut多个列表视图正在被剪切
【发布时间】:2011-12-11 14:39:41
【问题描述】:

当我尝试使用多个列表视图进行线性布局时,我遇到了问题。最初,当我添加多个包含文本视图和列表视图的自定义线性布局时,我无法向下滚动页面,所以我发现添加滚动视图可以解决这个问题,但由于某种原因,它随后裁剪了线性布局视图,所以我只能看到每个列表的顶部。

这里是不同部分的代码:

主布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" 
  android:weightSum="1">
    <TextView 
        android:layout_height="wrap_content" 
        android:textAppearance="?android:attr/textAppearanceLarge" 
        android:id="@+id/whatsNewTitle" 
        android:text="Whats New?" 
        android:layout_width="wrap_content" 
        android:layout_gravity="center_horizontal" 
        android:textSize="30dip">
    </TextView>

    <Button android:layout_height="wrap_content" 
        android:id="@+id/home" 
        android:text="Home" 
        android:layout_weight="0.07" 
        android:layout_width="126dp">
    </Button>
    <ScrollView
        android:id="@+id/sv1"
        android:layout_width="fill_parent" 
        android:fillViewport="true" 
        android:layout_height="630dp"> 
        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:id="@+id/whats_new_content" 
            android:layout_height="fill_parent">
        </LinearLayout>
    </ScrollView>
</LinearLayout>

布局即时膨胀并多次添加到主布局中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:weightSum="1">
    <TextView
        android:text="TextView"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/new_date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" android:textSize="25dip">
    </TextView>

    <ListView
        android:id="@+id/new_files"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" android:background="#000000">
    </ListView>
</LinearLayout>

创建多个列表视图并显示它们的主要活动:

public class WhatsNew extends Activity{
private Button homeBtn;

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.whats_new_main);

        CreateLastModDateList();

        homeBtn = (Button) findViewById(R.id.home);
        homeBtn.setOnClickListener(new OnClickListener() {

            public void onClick(View v){
                Intent myIntent = new Intent(getApplication().getApplicationContext(),
                    Main.class);
                startActivityForResult(myIntent, 0);
            }
        });
    }

    private ArrayList<File> GenerateNewFileDates(){
        Files.clearFilesList();
        Files.buildFilesList(Files.getRoot());

        return Files.getAllFiles();
    }

    private void CreateLastModDateList(){
        ArrayList<File> files = GenerateNewFileDates();
        ArrayList<String> allDates = new ArrayList<String>();
        ArrayList<String> dates = new ArrayList<String>();

        Context c = this.getApplicationContext();
        LinearLayout l = (LinearLayout) findViewById(R.id.whats_new_content);

        /** Builds a list of all file dates **/
        for(File file : files){
            Date lastModifiedDate = new Date(file.lastModified());
            allDates.add(lastModifiedDate.toString());
        }

        /** For each date, check if we have already put that date into the dates array
        if we have then we want to ignore it, otherwise add it to the dates array. **/
        for(String date : allDates){
            if (exists(dates,date) == false){
                dates.add(date);
            }
        }

        for(String date : dates){
            ArrayList<String> test = new ArrayList<String>();
            test = generateFileList(date, files);

            WhatsNewLayout whatsNew = new WhatsNewLayout(c,test, date);
            l.addView(whatsNew);
        }
    }

    public ArrayList<String> generateFileList(String date, ArrayList<File> mFiles){
        ArrayList<String> filesFromDate = new ArrayList<String>();

        for(File file : mFiles){
            Date lastModifiedDate = new Date(file.lastModified());
            boolean x = lastModifiedDate.toString().equals(date);

            if (x == true){
                filesFromDate.add(file.getName());
            }
        }
        return filesFromDate;
    }

    public boolean exists(ArrayList<String> list, String compare){
        boolean result = false;
        if(list.contains(compare)){
            result = true;
        }
        return result;
    }
}

我膨胀的自定义线性布局:

public class WhatsNewLayout extends LinearLayout  {

    private LayoutInflater mInflater;

    public WhatsNewLayout(Context context, ArrayList<String> files, String date) {
        super(context);
        mInflater = LayoutInflater.from(context);
        View convertView = new View(context);

        /** initialize variables **/
        DataHolder holder;
        Context c = this.getContext();

        ArrayAdapter<String> list = new ArrayAdapter<String>(c,
            android.R.layout.simple_list_item_1, files);

        convertView = mInflater.inflate(R.layout.whats_new_item, null);
        holder = new DataHolder();
        holder.modDate = (TextView) convertView.findViewById(R.id.new_date);
        holder.FileList = (ListView) convertView.findViewById(R.id.new_files);
        convertView.setTag(holder);

        holder.modDate.setText(date);
        holder.FileList.setAdapter(list);

        this.addView(convertView);
    }
}

对大量代码感到抱歉,但我不想遗漏任何细节以防万一它很重要,希望这就是一切,我确定它确实是我对布局的调用的基础,但我只是看不出是什么导致自定义布局被剪切。

如果需要更多详细信息,请告诉我。 =)

【问题讨论】:

    标签: android listview layout android-linearlayout


    【解决方案1】:

    在 ScrollView 中不可能有 ListView(因为 ListView 也是一个可滚动组件),这就是 ListView 被裁剪到屏幕上的原因。

    如果您需要在屏幕上显示多个列表让用户选择某些内容,您可以使用Spinner 而不是列表

    【讨论】:

    • 感谢您提供的信息。我设法让它工作,但不知何故。不知道为什么它仍在裁剪,但我进入自定义线性布局类并手动设置 layoutParams 中的高度并将其传递给 this.addView 并且它工作正常。又是一种可怕的编程方式,但它只是用于原型。再次感谢。
    【解决方案2】:

    将您的 listViews 放在垂直滚动中。您可以通过以下技巧在垂直滚动中拥有可滚动的 listView。使用下面的代码,尽情享受吧!

        private int listViewTouchAction;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //...
    
            setListViewScrollable(myListView1);
            setListViewScrollable(myListView2);
        }
    
        private void setListViewScrollable(final ListView list) {
                list.setOnTouchListener(new OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        listViewTouchAction = event.getAction();
                        if (listViewTouchAction == MotionEvent.ACTION_MOVE)
                        {
                            list.scrollBy(0, 1);
                        }
                        return false;
                    }
                });
                list.setOnScrollListener(new OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(AbsListView view,
                            int scrollState) {
                    }
    
                    @Override
                public void onScroll(AbsListView view, int firstVisibleItem,
                        int visibleItemCount, int totalItemCount) {
                    if (listViewTouchAction == MotionEvent.ACTION_MOVE)
                    {
                        list.scrollBy(0, -1);
                    }
                }
            });
        }
    

    listViewTouchAction 是一个全局整数值。

    【讨论】:

    • 感谢您的解决方案。我设法让它工作,但不知何故。不知道为什么它仍在裁剪,但我进入自定义线性布局类并手动设置 layoutParams 中的高度并将其传递给 this.addView 并且它工作正常。又是一种可怕的编程方式,但它只是用于原型。我还没有尝试获得点击监听器,所以这可能会再次变得非常糟糕,这意味着我可能不得不回来使用你提供的代码,再次感谢,因为它真的很有帮助 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多