Android:在大图像和小图像内显示多个较小的图像

时间:2015-08-11 15:23:40

标签: java android image android-framelayout

我正在开发一个Android应用程序,其中有一个名为Section的容器,里面可以有Note对象。用例是用户可以在一个部分中放置多个笔记并组织它们。目前,我将显示从服务器检索到的带有背景图像的部分名称。

现在我的问题是如何显示从该部分内的服务器收到的多个笔记。

我知道这可以通过FrameLayout实现,但动态Note计数就是我的问题所在。

请注意,笔记数量可能因用户而异。

以下是目前各个部分的原始屏幕截图:

Original image with each image as section

现在,当您添加备注时,理想情况下应该如下所示:

Screenshot with notes

该部分中的每个块都包含Note对象。为了显示它的内容,我想要显示一个音符块类型的图像和几个单词 注释内容。 目前我有代码从服务器检索Notes,可以显示部分,但我真的不知道如何继续,因为笔记可以是动态的。到目前为止,这是我的代码。

public class GroupSectionActivity extends Activity {

    private SectionServiceImpl sectionService = new SectionServiceImpl();

    private NoteServiceImpl noteService = new NoteServiceImpl();

    private static volatile List<RestSection> restSectionList = new ArrayList<>();

    private static volatile List<RestNote> restNoteList = new ArrayList<>();

    private static volatile Long groupAccountId;

    private static volatile Integer canvasid;

    ListView listView;

    SectionLazyAdapter sectionLazyAdapter;

    static final String msectionname = "msectionname";
    static final String msectionid = "msectionid";


    Button addSectionButton;

    EditText sectionName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sectionlayout);

        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            groupAccountId = extras.getLong("groupid");
            canvasid = extras.getInt("canvasid");
        }

        restSectionList = this.sectionService.getSectionByCanvas(canvasid);

        ArrayList<HashMap<String, String>> restSectionArrayList = new ArrayList<HashMap<String, String>>();
        for (RestSection restSection : restSectionList) {

            HashMap<String, String> sectionDisplay = new HashMap<>();
            sectionDisplay.put("msectionid", String.valueOf(restSection.getMsectionid()));
            sectionDisplay.put("msectionname", restSection.getMsectionname());
            restSectionArrayList.add(sectionDisplay);
        }

        listView = (ListView) findViewById(R.id.seclist);

        sectionLazyAdapter = new SectionLazyAdapter(this, restSectionArrayList);

        listView.setAdapter(sectionLazyAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                int sectionId = restSectionList.get(position).getMsectionid();
                Log.d("Sectionid is ", String.valueOf(sectionId));
                /*Intent intent = new Intent(GroupSectionActivity.this, GroupSectionActivity.class);
                intent.putExtra("groupid", groupAccountId);
                intent.putExtra("sectionid", sectionId);
                startActivity(intent);
                finish();*/

            }
        });

BaseAdapter来管理这些人:

public class SectionLazyAdapter extends BaseAdapter{

    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater=null;


    public SectionLazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
        activity = a;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return position;
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.activity_group_section, null);

        TextView sectionName = (TextView)vi.findViewById(R.id.sectionname); // title
     //   ImageView sectionImage=(ImageView)vi.findViewById(R.id.sectionimage); // thumb image

        HashMap<String, String> sectionList = new HashMap<String, String>();
        sectionList = data.get(position);

        // Setting all values in listview
        sectionName.setText(sectionList.get(GroupSectionActivity.msectionname));
         return vi;
    }
}

activity_group_section.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="5dip" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    <FrameLayout android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:weightSum="1">
        <ImageView
            android:id="@+id/sectionimage"
            android:layout_width="wrap_content"
            android:layout_height="300dp"
            android:scaleType="fitXY"
            android:src="@drawable/sectionbackground"
           />
    </FrameLayout>
    <TextView
        android:id="@+id/sectionname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/textView"
        android:visibility="visible"
        android:gravity="center"
        android:layout_gravity="center_horizontal" />
    </LinearLayout>
</RelativeLayout>

sectionlayout.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="{relativePackage}.${activityClass}" >

    <ListView
        android:id="@+id/seclist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/sectionAddButton">
    </ListView>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/sectionAddButton"
        android:layout_alignParentTop="true"
        android:background="@drawable/sectionbackground"
        android:text="Add Section" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/sectionNameTextField"
        android:layout_alignBottom="@+id/sectionAddButton"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_toEndOf="@+id/sectionAddButton"
        android:hint="Section Name"
        android:gravity="center"
        android:layout_toRightOf="@+id/sectionAddButton" />

</RelativeLayout>

我希望问题很清楚,如果遗漏了什么,请告诉我。

2 个答案:

答案 0 :(得分:2)

如果要以动态方式显示注释,则应在每个容器中实现GridView,如果为Grid内的每个注释设置了右边距,则组件将自身标注以适合您的部分。

GridView适配器非常简单,就像ListView适配器一样,您只需要定义列数,您可以在XML中执行此操作,也可以在Java代码中以编程方式执行此操作。

   <GridView
    android:id="@+id/grid_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:numColumns="3"/>

答案 1 :(得分:1)

首先让我指出Thomaz是对的,你应该使用GridView 这是满足您的需求和易用性的正确方法,但更重要的是它能够回收它的视图。
如果您不使用任何形式的视图回收,则可能会出现内存异常。

但是现在你面临另一个问题:你想让它分段显示 为什么这是一个问题?这是因为:
A)ListView和GridView都使用子视图进行回收,现在ListView的每个子视图都是一个GridView,其中包含更多的Views,这是一个非常复杂的事情。不可能,但相当复杂 B)由于ListView和GridView都是可滚动的(并且由于这个事实是可循环使用的),因此滚动内部存在需要解决的滚动问题。

幸运的是,我找到了答案:SuperSLiM(正式StickyGridHeaders) 这应该为您提供一个满足您需求的简单解决方案 祝你好运。